import { _decorator, Component, EventTouch, find, instantiate, Label, Node, NodeEventType, Pool, Prefab, tween, UITransform, v3, Vec3 } from 'cc';
import { UIBase } from '../../FrameWork3.8.6/FrameWork/UIFramework/UIBase';
import { GameManager } from '../Game/Manager/GameManager';
import { BundleConfig } from '../../FrameWork3.8.6/FrameWork/NeedToChange/BundleConfig';
import { Emitter } from '../../FrameWork3.8.6/FrameWork/Common/Emitter';
import { PlayerSkillDt, ShiBingDt } from '../../FrameWork3.8.6/FrameWork/Common/CommonInterface';
import { ResMgr } from '../../FrameWork3.8.6/FrameWork/Res/ResMgr';
import { SkillBtn } from '../Game/Object/SkillBtn';
import { ShiBingProgress } from '../Game/Object/ShiBingProgress';
import { ModuleMgr } from '../../FrameWork3.8.6/FrameWork/Module/ModuleMgr';
import { UIManager } from '../../FrameWork3.8.6/FrameWork/UIFramework/UIManager';
import { Player } from '../Game/Object/Player';
import { PlayerLayer } from '../Game/ModuleLayer/PlayerLayer';
const { ccclass, property } = _decorator;

@ccclass('MainUI')
export class MainUI extends UIBase {
    //技能属性格子对象池
    private _skillBtnNodePool:Pool<Node>=null;

    //兵种属性格子对象池
    private _shiBingNodePool:Pool<Node>=null;

    //技能槽按钮的容器，方便重新进入游戏时的删除所有的按钮
    private _arrSkillBtn:SkillBtn[]=[];
    //兵种槽按钮，方便update的调用
    private _shiBingProgress:Node=null;
    

    //当前关卡对于任务的描述
    private _task:string[]=[];
    //任务提示最终位置
    private _taskPos=v3(363,-16);
    //当前杀敌数量
    private killNum:number=0;
    //当前任务要求杀敌数量
    private requirementNum:number=0;
    //当前是第几个任务
    private taskNum:number=0;
    //游戏是否胜利
    private isVictory:boolean=false;

    //玩家移动参数
    private _leftfirstClickTime:number=0;//第一次点击时间
    private _rightfirstClickTime:number=0;
    private _interval:number=300;//触发双击设定间隔为300毫秒；

    onInit(...rest: any[]): void {
        //console.log(this._uiContainer);
        Emitter.instance.on("killEnemy",this.addEnemyNum,this);
        //对象池定义
        //获取网格节点的预制体
        let GridPrefab = ResMgr.instance.getRes<Prefab>(BundleConfig.Game.name, "SkillBtn");
        this._skillBtnNodePool = new Pool<Node>(()=>{
            let node =instantiate(GridPrefab);
            return node;
        },5,(node:Node)=>{
            node.destroy();
        });

        this._shiBingProgress=this.getNode("_ShiBingProgress");
        //注册判断游戏是否胜利的条件
        Emitter.instance.on("GameOver",this.gameIsOver,this);
        //初始化注册配置信息消息
        Emitter.instance.on("ConfigInfo",this.configInfo,this);
        //打开GameUI
        this.openUI("GameUI");
        this._task=rest[0].task;
        //将当前关卡要求存入GameManager
        GameManager.instance.requirements=rest[0].requirements;
        //判断要求当中第1个是否有数字，如果有数字则是当前杀敌数量要求
        let num=rest[0].requirements[0]
        //如果是数字
        if( this.isNumber(num)){
            this.requirementNum=num;
        }

        //敌人ID存储
        GameManager.instance.enemyID=rest[0].enemyID;

        //初始化执行更新任务信息
        this.updateTask(this._task[0]);

        //注册暂停按钮
        this.addClickEventListener("_PauseBtn",()=>{
            GameManager.instance.timePause=true;
            this.openUI("PausePanel",false,false,BundleConfig.UI.name,"Normal",rest[0].levelName);
        })

        //注册左右移动按钮
        let leftBtn=this.getNode("_LeftBtn");
        let rightBtn=this.getNode("_RightBtn")
        this.onTouch(leftBtn,this._leftfirstClickTime,"left");
        this.onTouch(rightBtn,this._rightfirstClickTime,"right");
    }

    //左右按钮事件注册
    onTouch(node:Node,_firstClickTime:number,dirName:string){
        //触摸事件开始
        node.on(NodeEventType.TOUCH_START,()=>{
            if(GameManager.instance.timePause){
                return;
            }
            let nowClickTime=Date.now();
            //正常移动
            Emitter.instance.emit("walk",UIManager.instance.getUI("GameUI").getNode("_PlayerLayer").getComponent(PlayerLayer),dirName);
            if(_firstClickTime==0){
                //那么这是第一次点击
                _firstClickTime=nowClickTime;
                return;
            }
            let timeDiff=nowClickTime-_firstClickTime;
            if(timeDiff<=this._interval){
                //触发双击
                Emitter.instance.emit("tp",UIManager.instance.getUI("GameUI").getNode("_PlayerLayer").getComponent(PlayerLayer),dirName);
                _firstClickTime=0;
                return;
            }
            _firstClickTime=nowClickTime;
        })

        //触摸事件移动
        node.on(Node.EventType.TOUCH_MOVE,(event:EventTouch)=>{
            //获取触摸点的位置
            let touchPos=event.getLocation();
            //获取节点的包围盒在世界坐标下的位置
            let nodeRect=node.getComponent(UITransform).getBoundingBoxToWorld();
            if(!nodeRect.contains(touchPos)){
                Emitter.instance.emit("end",UIManager.instance.getUI("GameUI").getNode("_PlayerLayer").getComponent(PlayerLayer),dirName);
            }
            
        })

        //触摸事件结束
        node.on(NodeEventType.TOUCH_END,()=>{
            Emitter.instance.emit("end",UIManager.instance.getUI("GameUI").getNode("_PlayerLayer").getComponent(PlayerLayer),dirName);
        })
    }

    //配置技能信息与兵种信息
    configInfo(arrSkillDt:PlayerSkillDt[],arrShiBingDt:ShiBingDt[]){
        if(arrSkillDt.length<=0||arrShiBingDt.length<=0){
            return;
        }
        //拿到技能信息与兵种信息的父类
        let skillParent=this.getNode("_Skill");
        //遍历技能表生成技能按钮
        for(let i=0;i<arrSkillDt.length;i++){
            //从对象池中拿出一个对象
            let skillBtn=this._skillBtnNodePool.alloc();
            //设置他的父亲与位置
            skillBtn.parent=skillParent;
            //计算向左边移动多少格
            let index=arrSkillDt.length-1-i;
            skillBtn.setPosition(v3(-200*index,0,0));
            let skillBtnTs=skillBtn.getComponent(SkillBtn);
            if(skillBtnTs){
                //如果存在则推入，且调用初始化方法
                this._arrSkillBtn.push(skillBtnTs);
                skillBtnTs.onInit(arrSkillDt[i]);
            }
        }   
        //直接将兵种数据丢给兵种脚本
        this._shiBingProgress.getComponent(ShiBingProgress).onInit(arrShiBingDt);

    }

    //游戏是否结束的方法
    gameIsOver(bool:boolean){
        this.isVictory=bool;
    }


    //统一管理当前游戏页面所有的更新数据管理
    protected update(dt: number): void {
        if(this.isVictory){
            //任务结束，游戏结束，弹出GameOver界面
            //打开游戏结算界面
            this.openUI("GameOverPanel",false,false,BundleConfig.UI.name,"Widget",true);
            //游戏逻辑暂停
            GameManager.instance.timePause=true;
            //重置胜利为false
            this.isVictory=false;
        }
        //如果游戏时间暂停那么所有UI无法动
        if(GameManager.instance.timePause){
            return;
        }
        //调用所有技能按钮的自更新方法
        if(this._arrSkillBtn.length>0){
            for(let skillBtn of this._arrSkillBtn){
                skillBtn.onUpdate.apply(skillBtn,arguments);
            }
        }
        //调用兵种按钮的自更新方法
        this._shiBingProgress.getComponent(ShiBingProgress).onUpdate(dt);
    }

    //是否是数据类型
    isNumber(num:any){
        return  typeof num==="number"&&!isNaN(num);
    }

    //增加杀敌数量
    addEnemyNum(num:number){
        //console.log(this._uiContainer);
        this.killNum+=num;
        this.getComp<Label>("_KillNum","Label").string="已经杀敌数量"+this.killNum+"/"+this.requirementNum;
        if(this.killNum>=this.requirementNum){
            //当杀敌数量达到要求时，将当前杀敌数量置为0
            this.killNum=0;
            this.nextTask();
           
        }
    }

    //开始下一个任务
    nextTask(){
        this.requirementNum=1000;
        //更新下一个任务
        if(this.taskNum<this._task.length){
            this.updateTask(this._task[this.taskNum]);
            return;
        }
        this.isVictory=true;
       
       
    }


     //任务更新信息
    updateTask(task:string){
        this.taskNum++
        //去掉上一个任务的当前杀敌数信息
        this.getComp<Label>("_KillNum","Label").string="";
        //更新label上的提示信息
        let label=this.getComp<Label>("_TaskTipLabel","Label").string=task;
        //设置初始位置在屏幕中间
        let taskNode=this.getNode("_TaskTip");
        taskNode.setPosition(v3(856,-366));
        taskNode.setScale(v3(2,2,1))
        //暂停打斗代码执行
        GameManager.instance.timePause=true;
        //需要玩家点击继续（目的为了方便玩家看清楚任务）
        let enterNode=this.getNode("_EnterNative");
        enterNode.active=true;
        //注册触摸事件开始
        enterNode.on(Node.EventType.TOUCH_START,(event:Event)=>{
            tween(taskNode)
            .to(0.3,{position:this._taskPos,scale:v3(1,1,1)})
            .call(()=>{
                enterNode.off(Node.EventType.TOUCH_START);
                enterNode.active=false;
                //恢复执行
                GameManager.instance.timePause=false;
            })
            .start();
        },this)

    }

}


